package org.swimv2.controller;

import java.util.ArrayList;
import java.util.Collection;

import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.ejb3.annotation.RemoteBinding;
import org.swimv2.model.Persona;

/**
 * Session Bean implementation class GestioneRicerca
 */
@Stateful
@RemoteBinding(jndiBinding="GestioneRicercaRemote")
public class GestioneRicerca implements GestioneRicercaRemote {
	@PersistenceContext(unitName="swimv2db")
	private EntityManager manager;
	
	public static final String JNDI_NAME="GestioneRicercaRemote";
	
    /**
     * Default constructor. 
     */
    public GestioneRicerca() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public Collection<Persona> getUtenti(String abilita, String regione,
			int disponibilita) {
		Collection<Persona> risultato = null;
		byte disp= (byte) disponibilita;
		Query q;
		if(!regione.equals("All"))
		{
		q = manager.createNamedQuery("Persona.findByAbRegDisp");
		q.setParameter("regione", regione);
		}
		else{
		q = manager.createNamedQuery("Persona.findByAbDisp");
		}
		q.setParameter("abilita", abilita);
		q.setParameter("disponibilita", disp);
		risultato = (ArrayList<Persona>)q.getResultList();
		return risultato;
	}

	@Override
	public Collection<Persona> getUtenti(String abilita, String regione,
			int disponibilita, String richiedente) {
		Collection<Persona> risultato = null;
		byte disp= (byte) disponibilita;
		Query q1 = manager.createNamedQuery("Abilita.findByNome");
		q1.setParameter("abilita", abilita);
		try{
		q1.getSingleResult();
		}
		catch(NoResultException e){
			return risultato;
		}
		Query q;
		if(!regione.equals("All"))
		{
		q = manager.createNamedQuery("Persona.findByAbRegDispUt");
		q.setParameter("regione", regione);
		}else
		{
			q = manager.createNamedQuery("Persona.findByAbDispUt");			
		}
		q.setParameter("richiedente",richiedente);
		q.setParameter("abilita", abilita);
		q.setParameter("disponibilita", disp);
		risultato = (ArrayList<Persona>)q.getResultList();
		return risultato;
	}

	@Override
	public Collection<Persona> getUtenti(String nome, String cognome,
			String username) {
		
		Collection<Persona> risultato = null;
		Query q = manager.createNamedQuery("Persona.findByUsername");
		q.setParameter("username", username);
		risultato = (ArrayList<Persona>)q.getResultList();
		if(risultato==null)
		{
			risultato = new ArrayList<Persona>();
		}
		if(!(nome==null || cognome==null))
		{
			q = manager.createNamedQuery("Persona.findByNomeCognome");
			q.setParameter("nome",nome);
			q.setParameter("cognome",cognome);
			Collection<Persona> risultato2 = (ArrayList<Persona>)q.getResultList();
			risultato.addAll(risultato2);
		}
		
		
		return risultato;
	}

	@Override
	public Collection<Persona> getAmiciUtente(String userId) {
		
		
		Query q = manager.createNamedQuery("Persona.findAmiciByUsername");
		q.setParameter("userId",userId);
		
		return q.getResultList();
		
	}

	@Override
	public Collection<Persona> getUtenti(int disponibilita, String abilita,
			String regione, String userId) {
		Collection<Persona> risultato = null;
		byte disp= (byte) disponibilita;
		Query q = manager.createQuery("SELECT p FROM Persona p,Persona p1,Abilita a WHERE a.nome=:abilita AND (p MEMBER OF a.personas)  AND p.regione=:regione AND p.disponibilita>=:disponibilita AND p1.userID=:userId AND (p NOT MEMBER OF p1.personas1) AND (p NOT MEMBER OF p1.personas2)");
		q.setParameter("abilita", abilita );
		q.setParameter("regione", regione);
		q.setParameter("disponibilita", disp);
		q.setParameter("userId", userId);
		
		risultato = (ArrayList<Persona>)q.getResultList();
		return risultato;
	}

}
